#ifndef __MY_HOT__
#define __MY_HOT__ 
#include "data.hpp"
#include <unistd.h>

extern cloud::DataManager *_data;//全局数据

namespace cloud
{
  class HotManager//热点管理类
  {
    private:
      time_t _hot_time = 30;//热点判断时长，理论应该是可配置项
      std::string _backup_dir = "./backup_dir/";//要检测的源文件的存储路径
    public:
      HotManager()//构造函数
      {
        FileUtil(_backup_dir).CreateDirectory();//创建对应目录
      }
      bool IsHot(const std::string &filename)//根据传进来的文件名
      {
        time_t atime = FileUtil(filename).ATime();//atime为上一次访问时间
        time_t ctime = time(NULL);//ctime为系统当前时间
        if(ctime-atime > _hot_time)
        {
          return false;//并不是热点文件
        }
        return true;//否则是一个热点文件
      }
      bool RunModule()//模块
      {
        while(1)
        {
          //1.遍历目录
          std::vector<std::string> arry;
          FileUtil(_backup_dir).ScanDirectory(&arry);
          //2.遍历信息
          for (auto &file : arry)
          {
            //3.获取指定文件时间属性以及当前系统时间，与热点时间进行比较
            if(IsHot(file) == true)
            {
              continue;//是热点文件则暂时不处理
            }
            //3.5获取当前文件历史信息
            FileInfo info;
            bool ret = _data->SelectOneByRealpath(file, &info);
            if(ret == false)
            {
              //处理方法1-显示这是异常文件啊
              std::cout << "This is a abnormal file\n"; //当前检测到的文件，没有历史备份信息,这可能是一个异常上传的文件
              FileUtil(file).Remove();//删除异常文件
              continue;//异常文件删除后，处理下一个

              //处理方法二-遇见没有历史备份信息文件，则新增备份信息进行压缩存储
              //_data->Insert(file);
              //_data->SelectOneByRealpath(file, &info);
            }
            //4.非热点进行压缩存储
            //不是热点文件则压缩存储 
            FileUtil(file).Compress(info.pack_path);//pack_path为压缩包路径名
            //5.压缩后则进行备份信息修改，修改pack_flag
             _data->UpdataStatus(file, true);//调用接口进行更新
             //看一下是哪个文件在被压缩
             std::cout << info.real_path << "<--Compress-->" << info.pack_path <<std::endl;

          }
          usleep(1000);//防止空目录情况下一直空遍历过度消耗CPU
        }
        return true;
      }
  };
}

#endif 
